#! /usr/local/bin/python
#-*- coding: utf-8 -*-

"""Changement de style du jeu.

Gestion du changement du style du jeu :
cases du canvas, images et texte.
Li les fichiers de configurations.
"""

"""
Minesweeper 3K. Original implementation of the classic game of mines
for Python 3.
Copyright (C) 2010  Cedric Bonhomme

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Minesweeper 3K  Copyright (C) 2010  Cedric Bonhomme
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
"""

__author__ = "Jerome Hussenet, Cedric Bonhomme"
__date__ = "$Date: 2010/02/27 $"
__copyright__ = "Copyright (c) 2010 Jerome Hussenet, Copyright (c) 2010 Cedric Bonhomme"
__license__ = "GPL 3"

from tkinter import *
import os

class Style(object):
    """Classe Style.

    Permet de modifier le style du jeu :
    cases du canvas, images et texte.
    """
    def __init__(self, style = "gnome"):
        """Initialise les données de l'objet Sytle.

        Charge le style par défaut utile si un fichier
        de configuration est mal formé.
        """
        self.listeStyle = []
        self.leStyle = style

        # liste des 18 fichiers obligatoires par styles
        self.fichiers = ['cache.gif', 'mine.gif', 'croix.gif', 'drapeau.gif', \
                        'cool.gif', 'peur.gif', 'gagne.gif', 'perdu.gif', 'conf']
        for i in range(9):
            self.fichiers.append(str(i) + '.gif')

        self.listeStyle = self.chercheStyle()

        # paramètres par défaut
        self.largCanevas = 16
        self.curseur = "hand1"
        self.textStyle = { \
                "fg" : "black", \
                "highlightthickness" :  0, \
                "width" : 5, \
                "font" : ("arial", 22) \
                }

        try:
            self.pause = PhotoImage(file = './img/pause.gif')
        except TclError as e:
            print(_("Image non trouvée :\n"),  e)
            print()

    def chargeStyle(self, style):
        """Charge le nouveau style.

        Charge les photos et les paramètres de texte.
        """
        try:
            self.cache = PhotoImage(file = './img/' + style + '/cache.gif')
            self.mine = PhotoImage(file = './img/' + style + '/mine.gif')
            self.croix = PhotoImage(file = './img/' + style + '/croix.gif')
            self.drapeau = PhotoImage(file = './img/' + style + '/drapeau.gif')
            self.cool = PhotoImage(file = './img/' + style + '/cool.gif')
            self.peur = PhotoImage(file = './img/' + style + '/peur.gif')
            self.gagne = PhotoImage(file = './img/' + style + '/gagne.gif')
            self.perdu = PhotoImage(file = './img/' + style + '/perdu.gif')
        except TclError as e:
            print(_("Image(s) non trouvée(s) :\n"),  e)
            print()

        self.chiffre=[]
        self.leStyle = style

        for i in range(9):
            try:
                self.chiffre.append(PhotoImage(file = './img/' + style \
                        + "/" + str(i) + '.gif'))
            except TclError as e:
                print(_("Image non trouvée :\n"),  e)
                print()

        # pour chaque style on intialise les paramètres
        # si un paramètre manque on prend celui par défaut
        for i in self.listeStyle:
            if i[0] == style:
                self.largCanevas = int(i[2])
                self.curseur = (i[3] and [i[3]] or [self.curseur])[0]
                self.textStyle["fg"] = (i[4] and [i[4]] or [self.textStyle["fg"]])[0]
                self.textStyle["highlightthickness"] = \
                        (i[5] and [int(i[5])] or [self.textStyle["highlightthickness"]])[0]
                self.textStyle["width"] = (i[6] and [int(i[6])] or [self.textStyle["width"]])[0]
                self.textStyle["font"] = (i[7] and [(i[7][0], int(i[7][1]))] or [self.textStyle["font"]])[0]
                # si un paramètre manque on renvoie sa valeur par défaut

    def chercheStyle(self):
        """Cherche les dossiers de styles.

        Vérifie si les 18 fichiers minimum necessaires sont présents
        et la précence du fichier "conf".
        """
        for (dirpath, dirnames, filenames) in os.walk('./img/'):
            nomStyle, taille = "", 0
            for dir in dirnames:
                lireConf = True
                listeFichier = os.listdir(os.path.join(dirpath, dir))

                if len(listeFichier) >= 18:
                    for fich in listeFichier:
                        if fich not in self.fichiers:
                            lireConf = False

                    if lireConf: # alors on peut lire le fichier de configuration
                        nomStyle, taille, curseur, fg,\
                            highlightthickness, width, (fontName, fontSize) = self.lireFichierConfiguration(os.path.join(dirpath, dir+"/conf"))

                        if nomStyle != "" and taille != 0:
                            self.listeStyle.append((dir, nomStyle, taille, curseur, fg,\
                                        highlightthickness, width, (fontName, fontSize)))
        return self.listeStyle

    def lireFichierConfiguration(self, fichier):
        """Lis les fichiers de configuration.

        Si le fichier de style est au bon format, on renvoie les informations.
        Seul nomStyle et taille sont obligatoires.
        Les autres options peuvent être vides.
        """
        nomStyle, taille = "", 0
        fg, width= "", ""
        fontName, fontSize = "", 0
        highlightthickness = ""
        fichierConfiguration = None
        try:
            fichierConfiguration = open(fichier, "r")
        except:
            pass
        if fichierConfiguration:
            for ligne in fichierConfiguration:
                if ligne != "\n" and ligne != "":
                    cle, valeur = ligne.split('=')
                    valeur = valeur.replace('\n', '')
                    if cle == "nomDuStyle":
                        nomStyle = valeur
                    if cle == "taille":
                        taille = valeur
                    if cle == "curseur":
                        curseur = valeur
                    if cle == "fg":
                        fg = valeur
                    if cle == "highlightthickness":
                        highlightthickness = valeur
                    if cle == "width":
                        width = valeur
                    if cle == "font":
                        fontName, fontSize = valeur.split('-')
            fichierConfiguration.close()
            return (nomStyle, taille, curseur, fg, highlightthickness, width, (fontName, fontSize))


if __name__ == "__main__":
    # Point d'entrée en mode exécution.
    style = Style()
    style.chercheStyle()